
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>借用构造函数继承</title>
</head>
<body>
    
    <script>

        // 类式继承 （构造函数假继承、对象冒充）
        /*
            步骤:
                1. 定义父类型构造函数
                2. 定义子类型构造函数
                3. 在子类型构造函数中调用父类型构造
            关键:
                1. 在子类型构造函数中通用call()调用父类型构造函数
            缺点：
                1. 没有在原型链本质上发生继承 是假继承
                2. 方法都在构造函数中定义，每次创建实例都会创建一遍方法
        */

// 2. 借用构造函数  借用构造函数的技术，其基本思想为:在子类型的构造函数中调用超类型构造函数。
// 优点:可以向超类传递参数 解决了原型中包含引用类型值被所有实例共享的问题
// 缺点:方法都在构造函数中定义，函数复用无从谈起，另外超类型原型中定义的方法对于子类型而言都是不可见的。
        // 1. 定义父类型构造函数
        function SuperType(name) {
            this.name = "yetter"
            this.colors = ['pink', 'blue', 'green']
        }


        // 2. 定义子类型构造函数
        function SubType(name) {
            // 3. 在子类型构造函数中调用父类型构造
            // SuperType.call(this,name)
            // SuperType.apply(this,[name])
            SuperType.bind(this,name)()
        }

        let ins  = new SubType("mary")
        ins.colors.push("yellow")
        console.log(ins.colors);

        let ins2  = new SubType("king")
        console.log(ins2.colors);


        
      




    </script>
</body>
</html>